/*
 * 文件名称：AppThread.cpp
 * 文件描述：提供应用程序线程封装
 * 作者信息：Satan-Emperor
 * 版本信息：V1.0.0
 * 修改历史：2014-04-22
 */

#include "AppThread.h"
#include "debugLog.h"

/*
 * 函数名称：AppThread
 * 函数描述：构造AppThread
 * 输入参数：无
 * 输出参数：无
 * 其他说明：
 */
AppThread::AppThread()
{
}

/*
 * 函数名称：AppThread
 * 函数描述：析构AppThread
 * 输入参数：无
 * 输出参数：无
 * 其他说明：
 */
AppThread::~AppThread()
{
}

/*
 * 函数名称：createThread
 * 函数描述：创建新的线程
 * 输入参数：1.isDetached:
 *			 2.isScopeInSystem:
 *			 3.stackSize:
 *			 4.pFunc:
 *			 5.param:
 * 输出参数：无
 * 其他说明：
 */
int AppThread::createThread(int isDetached, int isScopeInSystem, int stackSize, TheadFunc pFunc, void *param)
{
    if (pFunc == NULL)
    {
        DEBUG_WARNING(COMMON_LIB, "Thread function is NULL, thread will not be created");
        return -1;
    }

    int ret = 0;

    pthread_attr_t attr;
    ret = pthread_attr_init( &attr);
    if (ret != 0)
    {
        DEBUG_API_ERROR(COMMON_LIB, "pthread_attr_init()");
    }

    if (isDetached)
    {
		/* 线程分离属性，默认是结合的(joinable)，当设置为分离(detached)，则不能被pthread_join结束 */
        ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
        if (ret != 0)
        {
            DEBUG_API_ERROR(COMMON_LIB, "pthread_attr_setdetachstate()");
        }
    }

    if (isScopeInSystem)
    {
		/* 线程竞争作用域属性，默认是结合的(PROCESS)，当设置为系统(SYSTEM)，则该线程在系统级竞争资源 */
        ret = pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM);
        if (ret != 0)
        {
            DEBUG_API_ERROR(COMMON_LIB, "pthread_attr_setscope()");
        }
    }

	/* 线程堆栈大小属性，默认由系统分配，当指定大小后，则线程最大可用此大小空间 */
    ret = pthread_attr_setstacksize(&attr, stackSize);
    if (ret != 0)
    {
        DEBUG_API_ERROR(COMMON_LIB, "pthread_attr_setstacksize()");
    }

	/* 创建线程，第一个属性为进程ID指针，第二个参数为属性，第三个参数为线程运行函数指针，第四个参数为附带参数 */
    if (pthread_create(&mThead, &attr, pFunc, param) != 0)
    {
        goto ERROR;
    }

ERROR:
    pthread_attr_destroy(&attr);

    return 0;
}

/*
 * 函数名称：exitThead
 * 函数描述：创建新的线程
 * 输入参数：无
 * 输出参数：无
 * 其他说明：pthread_exit一般由子线程调用，pthread_join一般由主进程调用且可获得返回值(需属性为结合型)
 */
void AppThread::exitThead(void)
{
    pthread_exit(NULL);
}

//EOF
